package api;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.User;
import model.UserDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: DELL
 * Date: 2023-03-23
 * Time: 17:48
 */

// 登陆请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 前端约定: 将页面更改为 from 表单. ajax请求无法跳转页面
        // 点击登陆按钮以后, 验证密码并跳转到博客主页
        // form 表单响应为 302 才能够进行页面跳转
        // HTTP/1.1 302  Location: blog_list_html

        // 约定前端: 前端发送 ajax 请求, 将用户输入的账号和密码传入, 进行验证.
        // HTTP/1.1 Post ContentTYpe: application/json  username = ? password = ?

        // 约定后端: HTTP/1.1 200 OK 发送校验码给前端

        // 前端发来的数据为 json 格式字符串
        req.setCharacterEncoding("utf8");
        ObjectMapper objectMapper = new ObjectMapper();
        resp.setContentType("application/json; charset = utf8");
        // 1. 将前端发来的数据进行转换
        User user = objectMapper.readValue(req.getInputStream(), User.class);
        // 2. 读取数据库, 判断用户和密码是否匹配
        // 根据传来的账号查询 是否有对应的密码

        UserDao userDao = new UserDao();
           // 根据当前传入的用户名查询是否有对应的用户
        User user1 = userDao.selectByUsername(user.getUsername());

        if(user1 == null) {
            // 说明此时这个用户名没有对用的用户存在, 表明用户名错误
            // 响应错误码给前端, 说明用户或密码错误
            resp.getWriter().write("{\"issuccess\":false}");
            return;
        }

        System.out.println(user1); // 看一下这里的输出结果

        // ok 我就差一个你说的编辑了 其他的都差不多了,我看看 没有主页嘛? 我检查一下一会儿 完了发给你 好的 退下吧小加子


        // 存在 user1 用户, 获取其密码

        // 比较密码是否和当前前端传来的密码一致
        if(!user1.getPassword().equals(user.getPassword())) {
            resp.getWriter().write("{\"issuccess\":false}");
            return;
        }

        // 建立会话保存 用户所有信息
        HttpSession session = req.getSession(true);
        session.setAttribute("password", "");
        session.setAttribute("user", user1);
        resp.getWriter().write("{\"issuccess\":true}");

        // 其实你这里不用存那么多字段,存一个userId就够了,顶多再加个username  我知道 我这里是看看里面有什么有没有存错了


        // 告诉Servlet按照什么格式构造响应
//        resp.setContentType("text/html; charset = utf8");
//
//        // 告诉 Servlet 按照什么格式理解请求
//        req.setCharacterEncoding("utf8"); // 反之乱码
//        // 1. 读取参数中的用户名以及密码
//        // 如果此处用户名或者密码包含中文, 读取可能会乱码
//        String username = req.getParameter("username");
//        String password = req.getParameter("password");
//        String html = "<h3> 登陆失败! 账户或密码错误</h3>";
//
//        if(username == null || username.equals("") || password == null || password.equals("")) {
//            System.out.println("账号或密码错误!");
//            resp.getWriter().write(html);
//            return;
//        }
//        // 2. 读取数据库, 判断用户是否存在且密码是否匹配
//        UserDao userDao = new UserDao();
//        // 根据用户名查找用户
//        User user = userDao.selectByUsername(username);
//        if(user == null) {
//            // 用户名不存在
//            System.out.println("登陆失败! 用户名不存在!");
//            resp.getWriter().write(html);
//            return;
//        }
//        if(!password.equals(user.getPassword())) {
//            System.out.println("登陆失败! 密码错误!");
//            resp.getWriter().write(html);
//            return;
//        }
//
//        // 登陆成功 服务器保存账户信息 创建会话 并把会话ID返回给浏览器
//        HttpSession session = req.getSession(true);
//        // session 对象本身作为一个 Map 把user作为key user值作为value保存用户信息
//        // 把 user对象的值 存到 key 为 user 中, 方便后续访问其他页面时通过会话获取到当前的登陆状态
//        session.setAttribute("user", user);
//        // 设置重定向, 跳转至博客列表页
//        resp.sendRedirect("blog_list.html");
//        System.out.println("登陆成功!!!");


    }

}
